/**
 * 
 */
package org.yelongframework.mybatis.mapper;

import java.util.List;
import java.util.Map;

import org.apache.ibatis.annotations.Options;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.apache.ibatis.mapping.StatementType;

/**
 * 通用注解映射
 * 
 * @since 1.0.0
 */
public interface GenericMapper {

	/** SQL参数标识 */
	String SQL_ID = "yelongframework_sql_id";

	/** SQL语句 */
	String SQL = "${" + SQL_ID + "}";

	/** 结果Map标识 */
	String RESULT_MAP_ID = "yelongframework_resultmap_map";

	// ==================================================执行SQL返回执行行数==================================================

	/**
	 * 执行数据库操作
	 * 
	 * @param params 参数
	 * @return 执行的结果
	 */
	@Update(SQL)
	Integer executeUpdate(GenericMapperParam param);

	// ==================================================执行查询==================================================

	/**
	 * 执行查询SQL
	 * 
	 * @param params 参数
	 * @return SQL执行结果
	 */
	@Select(SQL)
	List<Map<String, Object>> executeQuery(GenericMapperParam param);

	/**
	 * 查询查询SQL，返回一列数据
	 * 
	 * @param <T>    result value type
	 * @param params 参数
	 * @return 查询的一列数据
	 */
	@Select(SQL)
	<T> List<T> executeQueryColumn(GenericMapperParam param);

	// ==================================================执行存储过程或函数==================================================

	/**
	 * 执行存储过程或函数
	 * 
	 * @param params 参数
	 * @return 执行结果。这可能是空的。值一般在参数的映射里面
	 */
	@Select(SQL)
	@Results(id = RESULT_MAP_ID)
	@Options(statementType = StatementType.CALLABLE)
	Map<String, Object> executeCall(GenericMapperParam param);

}
